package cn.com.twoke.app.pin_dou_dou.core;

import cn.hutool.core.lang.Version;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Gitee更新检测器
 * 用于从Gitee releases检查最新版本
 */
@Slf4j
public class GiteeUpdateChecker {
    
    // Gitee releases API URL 模板
    private static final String GITEE_RELEASES_API_URL = "https://gitee.com/api/v5/repos/%s/%s/releases/latest";
    // Gitee releases页面URL 模板 (用于在浏览器中打开)
    private static final String GITEE_RELEASES_PAGE_URL = "https://gitee.com/%s/%s/releases";
    
    // Gitee仓库信息 (用户名和仓库名)
    private final String owner;
    private final String repo;
    
    // 应用程序名称 (用于在提示信息中显示)
    private final String appName;
    
    /**
     * 构造函数
     * @param owner Gitee用户名
     * @param repo Gitee仓库名
     * @param appName 应用程序名称
     */
    public GiteeUpdateChecker(String owner, String repo, String appName) {
        this.owner = owner;
        this.repo = repo;
        this.appName = appName;
    }
    
    /**
     * 检查最新版本
     * @param currentVersion 当前版本
     * @return UpdateInfo 包含最新版本信息的对象，如果没有更新或检查失败则返回null
     */
    public UpdateInfo checkForUpdate(Version currentVersion) {
        try {
            String apiUrl = String.format(GITEE_RELEASES_API_URL, owner, repo);
            
            // 发送HTTP GET请求获取最新release信息
            HttpResponse response = HttpRequest.get(apiUrl).timeout(10000).execute();
            
            if (response.getStatus() == 200) {
                String responseBody = response.body();
                JSONObject releaseJson = JSONUtil.parseObj(responseBody);
                
                // 解析版本号 (从tag_name字段)
                String tagName = releaseJson.getStr("tag_name");
                if (StrUtil.isBlank(tagName)) {
                    log.warn("无法从Gitee release信息中解析到tag_name");
                    return null;
                }

                Version latestVersion;
                try {
                   latestVersion = new Version(tagName);
                } catch (Exception e) {
                    log.warn("无法从tag_name '{}' 中提取版本号", tagName);
                    return null;
                }
                
                // 比较版本
                if (latestVersion.compareTo(currentVersion) > 0) {
                    // 有新版本
                    String name = releaseJson.getStr("name"); // release标题
                    String body = releaseJson.getStr("body"); // release描述
                    String htmlUrl = releaseJson.getStr("html_url"); // release页面URL
                    
                    // 如果API没有返回html_url，则构造一个
                    if (StrUtil.isBlank(htmlUrl)) {
                        htmlUrl = String.format(GITEE_RELEASES_PAGE_URL, owner, repo);
                    }
                    
                    // 查找下载URL (查找assets中的zip文件)
                    String downloadUrl = findDownloadUrl(releaseJson);
                    if (StrUtil.isBlank(downloadUrl)) {
                        // 如果没有找到assets，则使用html_url作为下载页面
                        downloadUrl = htmlUrl;
                    }
                    
                    return new UpdateInfo(latestVersion, name, body, htmlUrl, downloadUrl);
                } else {
                    // 当前版本已是最新或更新
                    log.info("当前版本 {} 已是最新或更新", currentVersion);
                    return null;
                }
            } else {
                log.error("检查更新失败，HTTP状态码: {}", response.getStatus());
                return null;
            }
        } catch (Exception e) {
            log.error("检查更新时发生错误", e);
            return null;
        }
    }
    
    /**
     * 从release信息中查找下载URL
     * @param releaseJson release的JSON对象
     * @return 下载URL，如果找不到则返回null
     */
    private String findDownloadUrl(JSONObject releaseJson) {
        // 检查是否有assets字段
        if (releaseJson.containsKey("assets")) {
            Object assetsObj = releaseJson.get("assets");
            if (assetsObj instanceof java.util.List) {
                java.util.List<?> assets = (java.util.List<?>) assetsObj;
                for (Object assetObj : assets) {
                    if (assetObj instanceof JSONObject) {
                        JSONObject asset = (JSONObject) assetObj;
                        String name = asset.getStr("name");
                        String browserDownloadUrl = asset.getStr("browser_download_url");
                        
                        // 查找zip文件
                        if (StrUtil.isNotBlank(name) && name.toLowerCase().endsWith(".zip") && 
                            StrUtil.isNotBlank(browserDownloadUrl)) {
                            return browserDownloadUrl;
                        }
                    }
                }
            }
        }
        return null;
    }
    
    // Getters
    public String getOwner() {
        return owner;
    }

    public String getRepo() {
        return repo;
    }

    public String getAppName() {
        return appName;
    }
}